package com.atguigu.wordcount;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/*
    程序的入口

    常犯错误 ：
           1.导包错误 ----- ClassCastException
           2.在map和reduce方法中调用父类的方法 super.xxxx
           3.重复设置输出的类型--写了两个OutputKey
                 job.setMapOutputKeyClass(Text.class);
                  job.setMapOutputKeyClass(LongWriteable.class);
           4.电脑登录系统的用户名为中文或有空格
                解决方案 ：重新创建一个新用户（改名字没用）
                    NativeIOxxxxxx -----  1.代码写错了  2.系统登录用户名是中文或有空格
 */
public class WCDriver {
    public static void main(String[] args) throws Exception {
        //1.创建Job实例
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);

        //2.给Job赋值
        //设置Jar加载路径--将main方法所在的类传过去（如果是本地运行可以不写）
        job.setJarByClass(WCDriver.class);
        //设置Mapper和Reducer类
        job.setMapperClass(WCMapper.class);
        job.setReducerClass(WCReducer.class);
        //设置Mapper输出的key,value的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        //设置最终输出的key,value的类型(在这是Reducer输出的key,value的类型)
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        //设置数据的输入输出路径
        FileInputFormat.setInputPaths(job,new Path("D:\\io\\input"));
        //注意：输出的目录必须不存在
        FileOutputFormat.setOutputPath(job,new Path("D:\\io\\output1233"));

        //3.运行Job
        /*
        waitForCompletion(boolean verbose)
        verbose : 是否打印用户执行时的信息
        返回值  ：如果为true表示执行成功
         */
        boolean b = job.waitForCompletion(true);
        //退出JVM时的状态：0为正常退出，1为非正常退出
        System.exit(b? 0 : 1);
    }
}
